{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 02 - 随机实验\n",
    "\n",
    "## 黄金标准\n",
    "\n",
    "在上一节中，我们看到了关联关系与因果关系为什么不同。我们还看到了使关联成为因果关系所需的条件。\n",
    "\n",
    "$\n",
    "E[Y|T=1] - E[Y|T=0] = \\underbrace{E[Y_1 - Y_0|T=1]}_{ATT} + \\underbrace{\\{ E[Y_0|T=1] - E[Y_0|T=0] \\}}_{BIAS}\n",
    "$\n",
    "\n",
    "\n",
    "回顾一下，如果没有偏差，关联就会变成因果关系。如果 \\\\(E[Y_0|T=0]=E[Y_0|T=1]\\\\)，就不会有偏差。换句话说，如果干预组和对照组相同或具有可比性，除了他们接受的干预外，关联将是因果关系。或者，用更专业的话说，当未处理的结果等于处理的反事实结果时。请记住，如果他们没有接受干预，这个反事实结果将是干预组的结果。\n",
    "\n",
    "我认为我们在使用数学解释如何使关联等于因果关系方面做得还不错。但这只是个理论。现在，我们来看看我们必须使偏差消失的第一个工具：**随机实验**。随机实验包括将群体中的个体随机分配到干预组或对照组。接受干预的比例不必是 50%。您可以进行一个实验，其中只有 10% 的样本得到处理。\n",
    "\n",
    "随机化通过使潜在结果独立于干预来消除偏见。\n",
    "\n",
    "$\n",
    "(Y_0, Y_1) \\perp\\!\\!\\!\\perp T\n",
    "$\n",
    "\n",
    "起初这可能会令人困惑（至少对我来说）。不过别担心，勇敢而真诚的伙伴，我会进一步解释的。如果结果与干预无关，这是否也意味着干预没有效果？嗯，是！但请注意，我不是在谈论结果。相反，我在谈论**潜在**结果。潜在的结果是在干预 (\\\\(Y_1\\\\)) 或控制 (\\\\(Y_0\\\\)) 下结果  **本来**会是怎样的。在随机试验中，我们**不**希望结果**独立**于干预，因为我们认为**干预会导致**结果。但我们希望**潜在**结果独立于干预。\n",
    "\n",
    "![img](./data/img/rct/indep.png)\n",
    "\n",
    "说潜在的结果独立于干预是说它们在预期中在干预组或对照组中是相同的。简单来说，这意味着干预组和对照组具有可比性。或者知道干预分配并没有给我任何关于干预前结果如何的信息。因此，\\\\((Y_0, Y_1)\\perp T\\\\) 意味着干预是唯一在干预和对照中产生结果差异的因素。要看到这一点，请注意独立性恰好意味着\n",
    "\n",
    "$\n",
    "E[Y_0|T=0]=E[Y_0|T=1]=E[Y_0]\n",
    "$\n",
    "\n",
    "正如我们所见，这使得\n",
    "\n",
    "$\n",
    "E[Y|T=1] - E[Y|T=0] = E[Y_1 - Y_0]=ATE\n",
    "$\n",
    "\n",
    "因此，随机化为我们提供了一种在干预和控制之间使用简单差异的方法，并将其称为干预效果。\n",
    "\n",
    "\n",
    "## 在遥远的学校\n",
    "\n",
    "2020 年，冠状病毒大流行迫使企业适应社会疏远。送货服务变得普遍，大公司转向远程工作策略。有了学校，就不一样了。许多人开始了自己的在线课程库。\n",
    "\n",
    "危机发生四个月后，许多人想知道引入的更改是否可以维持。毫无疑问，在线学习有其好处。这一次，它更便宜，因为它可以节省房地产和交通费用。它也可以更加数字化，利用来自世界各地的世界一流内容，而不仅仅是来自固定教师。尽管如此，我们仍然需要回答在线学习对学生的学习成绩是否有负面或正面影响。\n",
    "\n",
    "回答这个问题的一种方法是将主要提供在线课程的学校的学生与在传统课堂上授课的学校的学生进行比较。正如我们现在所知，这不是最好的方法。可能是在线学校只吸引纪律严明、成绩高于平均水平的学生，即使课堂表现出色。在这种情况下，我们将有一个正偏差，其中接受干预的学生在学业上比未接受干预的要好：\\\\(E[Y_0|T=1] > E[Y_0|T=0]\\\\)。\n",
    "\n",
    "或者，另一方面，可能是在线课程更便宜，并且主要由不太富裕的学生组成，他们可能除了学习之外还需要工作。在这种情况下，这些学生即使参加了预科班，也会比预科学校的学生表现更差。如果是这种情况，我们就会偏向另一个方向，即接受干预的学生在学业上比未接受干预的学生更差：\\\\(E[Y_0|T=1] < E[Y_0|T=0]\\\\)。\n",
    "\n",
    "所以，虽然我们可以做简单的比较，但不会很有说服力。无论如何，我们永远无法确定是否有任何偏见潜伏并掩盖了我们的因果关系。\n",
    "\n",
    "![img](./data/img/rct/lurking_bias.png)\n",
    "\n",
    "为了解决这个问题，我们需要使处理过和未处理过的具有可比性 \\\\(E[Y_0|T=1] = E[Y_0|T=0]\\\\)。 强制执行此操作的一种方法是将在线课程和演示课程随机分配给学生。 如果我们设法做到这一点，除了他们接受的干预外，是否干预不同场景下的平均情况相同。\n",
    "\n",
    "幸运的是，一些经济学家已经为我们做到了这一点。 他们将班级随机化，这样一些学生被分配到面对面的讲座，其他人只进行在线讲座，而第三组则进行在线和面对面讲座的混合形式。 在学期末，他们收集了标准考试的数据。\n",
    "\n",
    "下面是数据的样子："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(323, 10)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>gender</th>\n",
       "      <th>asian</th>\n",
       "      <th>black</th>\n",
       "      <th>hawaiian</th>\n",
       "      <th>hispanic</th>\n",
       "      <th>unknown</th>\n",
       "      <th>white</th>\n",
       "      <th>format_ol</th>\n",
       "      <th>format_blended</th>\n",
       "      <th>falsexam</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>63.29997</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>79.96000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>83.37000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>90.01994</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>83.30000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   gender  asian  black  hawaiian  hispanic  unknown  white  format_ol  \\\n",
       "0       0    0.0    0.0       0.0       0.0      0.0    1.0          0   \n",
       "1       1    0.0    0.0       0.0       0.0      0.0    1.0          0   \n",
       "2       1    0.0    0.0       0.0       0.0      0.0    1.0          0   \n",
       "3       1    0.0    0.0       0.0       0.0      0.0    1.0          0   \n",
       "4       1    0.0    0.0       0.0       0.0      0.0    1.0          1   \n",
       "\n",
       "   format_blended  falsexam  \n",
       "0             0.0  63.29997  \n",
       "1             0.0  79.96000  \n",
       "2             1.0  83.37000  \n",
       "3             1.0  90.01994  \n",
       "4             0.0  83.30000  "
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "data = pd.read_csv(\"./data/online_classroom.csv\")\n",
    "print(data.shape)\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们可以看到我们有 323 个样本。 这不完全是大数据，而是我们可以使用的东西。 为了估计因果效应，我们可以简单地计算每个干预组的平均分数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>gender</th>\n",
       "      <th>asian</th>\n",
       "      <th>black</th>\n",
       "      <th>hawaiian</th>\n",
       "      <th>hispanic</th>\n",
       "      <th>unknown</th>\n",
       "      <th>white</th>\n",
       "      <th>format_ol</th>\n",
       "      <th>format_blended</th>\n",
       "      <th>falsexam</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>class_format</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>blended</th>\n",
       "      <td>0.550459</td>\n",
       "      <td>0.217949</td>\n",
       "      <td>0.102564</td>\n",
       "      <td>0.025641</td>\n",
       "      <td>0.012821</td>\n",
       "      <td>0.012821</td>\n",
       "      <td>0.628205</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>77.093731</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>face_to_face</th>\n",
       "      <td>0.633333</td>\n",
       "      <td>0.202020</td>\n",
       "      <td>0.070707</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.010101</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.717172</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>78.547485</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>online</th>\n",
       "      <td>0.542553</td>\n",
       "      <td>0.228571</td>\n",
       "      <td>0.028571</td>\n",
       "      <td>0.014286</td>\n",
       "      <td>0.028571</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.700000</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>73.635263</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                gender     asian     black  hawaiian  hispanic   unknown  \\\n",
       "class_format                                                               \n",
       "blended       0.550459  0.217949  0.102564  0.025641  0.012821  0.012821   \n",
       "face_to_face  0.633333  0.202020  0.070707  0.000000  0.010101  0.000000   \n",
       "online        0.542553  0.228571  0.028571  0.014286  0.028571  0.000000   \n",
       "\n",
       "                 white  format_ol  format_blended   falsexam  \n",
       "class_format                                                  \n",
       "blended       0.628205        0.0             1.0  77.093731  \n",
       "face_to_face  0.717172        0.0             0.0  78.547485  \n",
       "online        0.700000        1.0             0.0  73.635263  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(data\n",
    " .assign(class_format = np.select(\n",
    "     [data[\"format_ol\"].astype(bool), data[\"format_blended\"].astype(bool)],\n",
    "     [\"online\", \"blended\"],\n",
    "     default=\"face_to_face\"\n",
    " ))\n",
    " .groupby([\"class_format\"])\n",
    " .mean())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "是的。就这么简单。我们可以看到面对面课程的平均得分为 78.54，而在线课程的平均得分为 73.63。对于在线学习的支持者来说，这不是个好消息。因此，在线课程的 \\\\(ATE\\\\) 为 -4.91。这意味着**在线课程会导致学生的平均成绩降低约 5 分**。就是这样。您不必担心在线课程可能有负担不起面对面课程的贫困学生，或者就此而言，您不必担心来自不同干预方法的学生在任何方面都有所不同他们接受的干预。根据设计，随机实验旨在消除这些差异。\n",
    "\n",
    "出于这个原因，一个很好的健全性检查以查看随机化是否正确（或者您是否正在查看正确的数据）是检查干预前变量中的干预变量是否等于未干预变量。在我们的数据中，我们有关于性别和种族的信息，因此我们可以查看它们在不同群体中是否平等。对于 `gender`、`asian`、`hispanic` 和 `white` 变量，我们可以说它们看起来非常相似。然而，`black` 变量看起来有点不同。这引起了人们对小数据集会发生什么的关注。即使在随机化的情况下，也可能是偶然地，一组与另一组不同。在大样本中，这种差异趋于消失。\n",
    "\n",
    "## 理想的实验\n",
    "\n",
    "随机实验或随机对照试验 (RCT) 是获得因果效应的最可靠方法。这是一种极其简单的技术，而且令人难以置信地令人信服。它是如此强大，以至于大多数国家都将其作为展示新药有效性的要求。做一个可怕的类比，您可以将 RCT 视为《阿凡达：最后的气宗》中的 Aang，而其他技术更像是 Sokka。 Sokka 很酷，可以在这里和那里拉一些巧妙的技巧，但 Aang 可以弯曲四个元素并连接精神世界。这样想，如果可以的话，RCT 将是我们为揭示因果关系所做的一切。精心设计的 RCT 是任何科学家的梦想。\n",
    "\n",
    "![img](./data/img/rct/science_dream.png)\n",
    "\n",
    "不幸的是，它们往往要么非常昂贵，要么就是完全不道德。有时，我们根本无法控制分配机制。想象自己是一名医生，试图估计怀孕期间吸烟对婴儿出生体重的影响。你不能简单地强迫一部分妈妈在怀孕期间吸烟。或者说你在一家大银行工作，你需要估计信用额度对客户流失的影响。向您的客户提供随机信用额度会太昂贵。或者您想了解提高最低工资对失业的影响。你不能简单地指定国家有一个或另一个最低工资。你明白了。\n",
    "\n",
    "稍后我们将看到如何通过使用条件随机化来降低随机化成本，但对于不道德或不可行的实验，我们无能为力。尽管如此，每当我们处理因果问题时，都值得考虑**理想的实验**。总是问自己，如果可以的话，**你将运行什么理想的实验来揭示这种因果效应？**这往往会揭示我们如何在没有理想实验的情况下揭示因果效应的方式。\n",
    "\n",
    "\n",
    "## 分配机制\n",
    "\n",
    "在随机实验中，将单位分配给一种或另一种处理的机制是随机的。正如我们稍后将看到的，所有因果推理技术都会以某种方式尝试识别处理的分配机制。当我们确定这种机制的行为方式时，因果推断将更加确定，即使分配机制不是随机的。\n",
    "\n",
    "不幸的是，仅通过查看数据无法发现分配机制。例如，如果您有一个数据集，其中高等教育与财富相关，您无法通过查看数据来确定是哪一个导致了哪一个。你将不得不利用你对世界如何运作的知识来支持一种合理的分配机制：学校是否教育人们，使他们更有效率，从而引导他们从事更高薪的工作。或者，如果您对教育持悲观态度，您可以说学校没有采取任何措施来提高生产力，这只是一种虚假的相关性，因为只有富裕的家庭才能让孩子获得更高的学位。\n",
    "\n",
    "在因果问题中，我们通常有可能以两种方式争论：X 导致 Y，或者是第三个变量 Z 导致 X 和 Y，因此 X 和 Y 的相关性只是虚假的。正是出于这个原因，了解分配机制会导致更有说服力的因果答案。这也是因果推断如此令人兴奋的原因。虽然应用机器学习通常只是按正确的顺序按下一些按钮，但应用因果推理要求您认真考虑生成该数据的机制。\n",
    "\n",
    "## 关键思想\n",
    "\n",
    "我们研究了随机实验如何成为揭示因果影响的最简单、最有效的方法。它通过使干预组和对照组具有可比性来做到这一点。不幸的是，我们不能一直做随机实验，但想想如果可以的话，我们会做的理想实验是什么仍然很有用。\n",
    "\n",
    "熟悉统计学的人现在可能会抗议我没有查看我的因果效应估计的方差。我怎么知道 4.91 点的下降不是偶然的？换句话说，我怎么知道差异在统计上是否显着？他们是对的。别担心。接下来我打算回顾一些统计概念。\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
